# 心算项目的挑战比赛中
# 要求选手从 N 张卡牌中选出 cnt 张卡牌
# 若这 cnt 张卡牌数字总和为偶数，则选手成绩「有效」且得分为 cnt 张卡牌数字总和。
# 给定数组 cards 和 cnt
# 其中 cards[i] 表示第 i 张卡牌上的数字
# 请帮参赛选手计算最大的有效得分，若不存在获取有效得分的卡牌方案，则返回 0。
# 示例 1：
# 输入：cards = [1,2,8,9], cnt = 3
# 输出：18
# 解释：选择数字为 1、8、9 的这三张卡牌，此时可获得最大的有效得分 1+8+9=18。
# 示例 2：
# 输入：cards = [3,3,1], cnt = 1
# 输出：0
# 解释：不存在获取有效得分的卡牌方案。
import math
import random


def max_cnt(cards, cnt):  # cards列表 cnt取多少次
    if type(cards) != list:  # cards值错误
        return "cards值不符合,cards必须是列表，且每一项都是整型"
    for item in cards:
        if type(item) != int:
            return "cards值不符合,cards必须是列表，且每一项都是整型"

    if type(cnt) != int or cnt < 1:  # cnt值错误
        return "cnt值不符合,cnt必须是整型，且cnt>=1"

    max_even_number = 0  # 最大偶数

    if cnt == 1:  # 当要取的值为1时，直接返回最大的偶数
        for item in cards:
            if item > max_even_number and not item % 2:
                max_even_number = item
        return max_even_number

    cards_sum_all = []  # 记录每次取卡
    # 一共多少种情况
    for i in range(0, math.comb(len(cards), cnt)):  # math.comb == C == cards!/( cnt! * (cards - cnt)! )
        while True:
            cards_sum = []  # 本次的结果

            for j in range(0, cnt):  # 要取几次
                while True:
                    num = random.randint(0, len(cards) - 1)
                    if num not in cards_sum:  # 所取的卡，并没有记录过，加入到本次结果中
                        cards_sum.append(num)
                        break
            for cards_i in range(0, len(cards_sum) - 1):  # 把本次结果排序
                for cards_j in range(0, len(cards_sum) - cards_i - 1):
                    if cards_sum[cards_j] > cards_sum[cards_j + 1]:
                        cards_sum[cards_j], cards_sum[cards_j + 1] = cards_sum[cards_j + 1], cards_sum[cards_j]

            for j in range(0, len(cards_sum)):  # 赋值
                cards_sum[j] = cards[cards_sum[j]]
            sum = 0  # 把取卡的和加起来，并加入到本次结果中
            for item in cards_sum:
                sum += item
            cards_sum.append(sum)

            if cards_sum not in cards_sum_all:  # 本次的结果还没出现过，就加入到所有取卡取卡结果中
                cards_sum_all.append(cards_sum)
                break

    for item in cards_sum_all:  # 返回最大的偶数
        if not item[cnt] % 2 and item[cnt] > max_even_number:
            max_even_number = item[cnt]
    return max_even_number


def explain_max_cnt(cards, cnt):
    cnt = max_cnt(cards, cnt)
    if type(cnt) == str:
        return cnt
    elif cnt == 0:
        return f"分数为{cnt},不存在获取有效得分的卡牌方案"
    else:
        return f"分数为{cnt}"


if __name__ == "__main__":
    list1 = [1, 2, 8, "9"]
    list2 = [1, 3, 7]
    list3 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

    print(explain_max_cnt(list1, 3))
    print(explain_max_cnt(list2, 1))
    print(explain_max_cnt(list3, 3))
